Client interceptors
If we need to create a client we have a few methods that we can override:
- BlockingUnaryCall: Intercepts a blocking invocation of an unary RPC.
- AsyncUnaryCall: Intercepts an asynchronous invocation of an unary RPC.
- AsyncClientStreamingCall: Intercepts an asynchronous invocation of a client-streaming RPC.
- AsyncServerStreamingCall: Intercepts an asynchronous invocation of a server-streaming RPC.
- AsyncDuplexStreamingCall: Intercepts an asynchronous invocation of a bidirectional-streaming RPC.
Configuring a client interceptor
To We can configure several interceptors, and these are executed in reverse order:
Interceptors order
var invoker = channel
.Intercept(new ClientTokenInterceptor())
.Intercept(new ClientMonitoringInterceptor())
.Intercept(new ClientLoggerInterceptor());
When it comes to the actual execution order, that happens in reverse:
ClientLoggerInterceptor- was lastClientMonitoringInterceptorClientTokenInterceptor- was first
Configure interceptors on clients
client interceptors aren't configured with GrpcChannelOptions. Instead, client interceptors are configured using the Intercept extension method with a channel. This extension method is in the Grpc.Core.Interceptors namespace.
static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var callInvoker = channel.Intercept(new LoggingInterceptor());
var client = new Greeter.GreeterClient(callInvoker);
}